前面幾天我們學過 merge、rebase、cherry-pick 等各種分支操作,
今天,我們要進入 Git 的「歷史編輯模式」:git rebase -i!
這個指令可以讓你在提交之後,重新整理、修改、合併、刪除你的 commit。
簡單說,就是讓你「改寫歷史」🕰️ —— 讓專案歷史看起來更乾淨、更有條理。
git rebase -i?在日常開發中,你可能會遇到:
fix typo
update again
really fix it this time
final fix
每次小修改都 commit,歷史亂成一團。
想要合併成一個完成版、修改訊息、刪除錯誤 commit,甚至改順序?
這時就靠 git rebase -i 了!
git rebase -i HEAD~N
i = interactive(互動式)HEAD~N = 從最近 N 個 commit 開始編輯pick a1 修正登入頁 bug
pick b2 改變按鈕顏色
pick c3 再次改顏色
pick d4 README 調整
每一行的 pick 都可以改成其他操作指令。
| 指令 | 意思 | 用途說明 |
|---|---|---|
pick |
保留 | 預設動作,代表不動這筆 commit |
reword |
修改訊息 | 想修改 commit message 時用 |
edit |
停下來編輯內容 | 修改這個 commit 的內容(例如漏加某檔案) |
squash |
合併進前一個 | 把這筆 commit 合併到前一筆 |
fixup |
合併(丟掉訊息) | 合併到前一筆 commit,但丟掉訊息 |
drop |
刪除 | 完全丟掉這筆 commit |
💡 小提醒:
- squash:保留訊息,會要求你編輯合併訊息
- fixup:丟掉訊息,自動合併,不打擾你
原始歷史:
a1 修正登入頁 bug
b2 改變按鈕顏色
c3 再次改顏色
d4 README 調整
如果你在編輯器裡只寫:
pick a1 修正登入頁 bug
squash b2 改變按鈕顏色
pick d4 README 調整
pick a1 修正登入頁 bug
squash b2 改變按鈕顏色
squash c3 再次改顏色
pick d4 README 調整
結果歷史:
a1 調整登入頁樣式 ← 原本 a1 + b2 + c3 的訊息合併後
d4 README 調整
Lesson:不要漏掉 commit 行,否則就等同 drop!
忘記加檔案到舊 commit:
git rebase -i HEAD~3
編輯:
pick a1 修正登入頁 bug
edit b2 改變按鈕顏色
pick c3 再次改顏色
Git 會停在 b2:
Stopped at b2... 改變按鈕顏色
補上檔案:
git add forgot.js
git commit --amend
git rebase --continue
❓ 為什麼需要 git commit --amend?
因為 edit 模式只暫停在那筆 commit,任何修改的檔案需要透過
--amend才能真正合併到原 commit 裡,而不是創建新的 commit。
隨時可中止 rebase:
git rebase --abort
簡單記:
⚠️ 改寫歷史具有風險!
任何使用 rebase 修改過的提交,其 commit ID(SHA)都會改變。
若這些 commit 已經 push 到遠端,那麼他人若基於舊歷史繼續開發,將導致衝突。
因此:
若你確定要同步遠端(例如私人專案),需使用:
git push --force
但請務必謹慎操作。
feature/rebase-demo
git rebase -i HEAD~4
| 功能 | 指令 | 用途 |
|---|---|---|
| 合併 commit | squash / fixup | 清理歷史 |
| 修改訊息 | reword | 修正 commit message |
| 修改舊 commit 內容 | edit + --amend | 補漏檔案 |
| 刪除 commit | drop | 移除不該存在的提交 |
| 放棄 rebase | --abort | 中止流程 |
git rebase -i 是 Git 的「時間旅行工具」,掌握它,你的 commit 歷史就能乾淨漂亮、易讀可追蹤